package com.javasea.websocket.service;

import com.javasea.websocket.entity.SessionUser;
import lombok.Data;
import lombok.NonNull;

import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author: 97622
 * @description: 登录用户会话缓存
 * @date: 2020/7/14 10:11
 * @version: 1.0
 **/
@Data
public class LoginUserCache {


    private static volatile Map<String, SessionUser> sessionMap = new ConcurrentHashMap<String, SessionUser>();

//    public static final String LOGIN_USER_CACHE_REDIS_KEY = "login_user_session_cache:";
//
//    private static RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);

    /**
     * login_user_cache: {userId->"UserSession"}
     * 存入redis
     *
     * @param userId
     * @param session
     */
    public static void put(@NonNull String userId, @NonNull SessionUser session) {
//        Object loginUserSessionRedisCache = redisUtil.get(LOGIN_USER_CACHE_REDIS_KEY);
        SessionUser userSession = get(userId);
        if (null != userSession) {
            //该用户在线，先remove掉
//            redisUtil.remove(getLoginUserCacheRedisKey(userId));
            sessionMap.remove(userId);
        }
        // 放进redis缓存
//        redisUtil.set(getLoginUserCacheRedisKey(userId), userId);
        sessionMap.put(userId, session);
    }

    public static void remove(@NonNull String userId) {
//        redisUtil.remove(getLoginUserCacheRedisKey(userId));
        sessionMap.remove(userId);
    }

    /**
     * 获取某个在线用户
     *
     * @param userId
     * @return
     */
    public static SessionUser get(@NonNull String userId) {
//        Object cacheObj = redisUtil.get(getLoginUserCacheRedisKey(userId));
        return Optional.ofNullable(sessionMap.get(userId)).orElse(new SessionUser());
//        if (null == userSession) {
//            return null;
//        } else {
//            return (UserSession)userSession;
//        }
    }

    /**
     * 用map形式获取所有登录用户
     *
     * @return
     */
    public static Map<String, SessionUser> getAllByMap() {
        return sessionMap;
//        Object o = redisUtil.get(LOGIN_USER_CACHE_REDIS_KEY + "*");
//        if (null == o) {
//            return new HashMap<>();
//        }
//        return (Map<String, UserSession>)o;
    }


    /**
     * 获取在线用户容量
     *
     * @return
     */
    public static int size() {
        return sessionMap.size();
    }

//    private static String getLoginUserCacheRedisKey(String userId) {
//        return LOGIN_USER_CACHE_REDIS_KEY + userId;
//    }


}
